package models

import (
	"go-iot/app/iot/core"
	"time"
)

type User struct {
	Id         int64     `gorm:"primaryKey;autoIncrement;column:id" json:"id"`     // user id
	Nickname   string    `gorm:"column:nickname" json:"nickname"`                  // 昵称
	Username   string    `gorm:"column:username" json:"username"`                  // 账号
	Password   string    `gorm:"column:password" json:"password,omitempty"`        // 密码
	Email      string    `gorm:"column:email;null" json:"email,omitempty"`         // 邮件
	Desc       string    `gorm:"column:desc;null" json:"desc,omitempty"`           // 备注
	EnableFlag bool      `gorm:"column:enable_flag" json:"enableFlag"`             // 启用标志1启用，0禁用
	CreateId   int64     `gorm:"column:create_id;null" json:"createId"`            // 创建者ID
	CreateTime time.Time `gorm:"column:create_time" json:"createTime"`             // 创建时间
}

type Role struct {
	Id         int64    `gorm:"primaryKey;autoIncrement;column:id" json:"id"` // role id
	Name       string   `gorm:"column:name" json:"name"`                      // 角色名
	Desc       string   `gorm:"column:desc" json:"desc"`                      // 描述
	CreateId   int64    `gorm:"column:create_id" json:"createId"`             // 创建者ID
	CreateTime time.Time `gorm:"column:create_time" json:"createTime"`         // 创建时间
}

type UserRelRole struct {
	Id     int64 `gorm:"primaryKey;autoIncrement;column:id" json:"id"`     // 关联ID
	UserId int64 `gorm:"column:user_id;index" json:"userId"`               // 用户ID
	RoleId int64 `gorm:"column:role_id;index" json:"roleId"`               // 角色ID
}

type MenuResource struct {
	ID         int       `gorm:"primaryKey;autoIncrement" json:"id"` // 菜单资源唯一标识
	Name       string    `gorm:"type:varchar(255)" json:"name"`      // 菜单资源名称
	Code       string    `gorm:"type:varchar(255)" json:"code"`      // 菜单资源代码
	Sort       int       `json:"sort"`                               // 菜单资源排序
	Action     string    `gorm:"type:text" json:"action"`            // 菜单资源操作信息
	CreateID   int64     `json:"createId"`                          // 创建者用户 ID
	CreateTime time.Time `json:"createTime"`                        // 菜单资源创建时间
}

// 授权资源
type AuthResource struct {
	Id         int64     `gorm:"primaryKey;autoIncrement;column:id" json:"id"`      // 授权资源ID
	ResType    string    `gorm:"column:type;size:20" json:"resType"`                // ROLE,USER
	Code       string    `gorm:"column:resource_code" json:"code"`                  // 资源编码
	Sort       int32     `gorm:"column:sort" json:"sort"`                           // 排序
	ObjId      int64     `gorm:"column:obj_id" json:"objId"`                        // 角色id或用户id
	Action     string    `gorm:"column:action;null" json:"action"`                  // 权限集
	CreateId   int64     `gorm:"column:create_id;null" json:"createId"`             // 创建者ID
	CreateTime time.Time `gorm:"column:create_time" json:"createTime"`              // 创建时间
}

type SystemConfig struct {
	Id     string `gorm:"primaryKey;column:id;size:64" json:"id"` // 配置 ID
	Config string `gorm:"column:config" json:"config"`            // 配置内容
	CreateTime time.Time `json:"createTime"`					// 创建时间
}

// 产品
type Product struct {
	Id          string         `gorm:"primaryKey;column:id;size:32" json:"id"` // 产品ID
	Name        string         `gorm:"column:name" json:"name"`                // 名称
	TypeId      string         `gorm:"column:type_id;null" json:"typeId"`      // 类型
	NetworkType string         `gorm:"column:network_type;size:32" json:"networkType"` // 网络类型MQTT_BROKER
	MetaData    string         `gorm:"column:meta_data;null" json:"metadata,omitempty"` // 物模型
	MetaConfig  string         `gorm:"column:meta_config;null" json:"metaconfig,omitempty"` // 配置属性
	State       int          `gorm:"column:state" json:"state"`              // 1启用，0禁用
	AllowView   int         `gorm:"column:allow_view" json:"allowView"`// 允许查看
	StorePolicy string         `gorm:"column:store_policy;size:32" json:"storePolicy"` // 数据存储策略
	Script      string         `gorm:"column:script" json:"script"`            // codec脚本
	CodecId     string         `gorm:"column:codec_id" json:"codecId"`         // 编解码id
	//Tag         map[string]any `gorm:"column:tag" json:"tag,omitempty"`        // 标签
	Desc        string         `gorm:"column:desc" json:"desc"`                // 产品说明
	CreateId    int64          `gorm:"column:create_id;null" json:"createId"`  // 创建者ID
	CreateTime  time.Time       `gorm:"column:create_time" json:"createTime"`   // 创建时间
}

// 设备
type Device struct {
	Id         string         `gorm:"column:id;size:32" json:"id,omitempty"` // 设备ID
	Name       string         `gorm:"column:name;size:64" json:"name,omitempty"` // 设备名称
	ProductId  string         `gorm:"column:product_id;size:32" json:"productId,omitempty"` // 产品id
	ParentId   string         `gorm:"column:parent_id;size:32" json:"parentId,omitempty"` // 网关id
	State      string         `gorm:"column:state;size:10" json:"state,omitempty"` // online,offline,unknow,noActive
	DeviceType string         `gorm:"column:device_type;size:32" json:"deviceType,omitempty"` // 设备类型device,gateway,subdevice
	MetaConfig string         `gorm:"column:meta_config" json:"metaconfig,omitempty"` // 配置属性
	//Tag        map[string]any `gorm:"column:tag" json:"tag,omitempty"` // 标签
	Desc       string         `gorm:"column:desc" json:"desc,omitempty"` // 产品说明
	CreateId   int64          `gorm:"column:create_id" json:"createId,omitempty"` // 创建者ID
	CreateTime time.Time       `gorm:"column:create_time" json:"createTime,omitempty"` // 创建时间
}

func (dev Device) ToDeviceOper() *core.Device {
	devopr := core.NewDevice(dev.Id, dev.ProductId, dev.CreateId)
	devopr.ParentId = dev.ParentId
	devopr.DeviceType = dev.DeviceType
	devopr.Name = dev.Name
	return devopr
}

// 网络配置
type Network struct {
	Id            int64    `gorm:"primaryKey;autoIncrement;column:id" json:"id"` // 网络配置 ID
	Name          string   `gorm:"column:name;size:64;null" json:"name"`         // 名称
	Port          int32    `gorm:"column:port" json:"port"`                      // 端口号
	ProductId     string   `gorm:"column:product_id;size:32;null" json:"productId"` // 产品id
	Configuration string   `gorm:"column:configuration;null" json:"configuration"` // 网络配置
	Type          string   `gorm:"column:type;size:32" json:"type"`              // 网络类型MQTT_BROKER
	State         string   `gorm:"column:state;size:10" json:"state"`            // 运行状态runing,stop
	AllowView     int         `gorm:"column:allow_view" json:"allowView"`// 允许查看
	CertBase64    string   `gorm:"column:cert_base64;null" json:"certBase64"`    // crt文件base64
	KeyBase64     string   `gorm:"column:key_base64;null" json:"keyBase64"`      // key文件base64
	CreateId      int64    `gorm:"column:create_id;null" json:"createId"`        // 创建者ID
	CreateTime    time.Time `gorm:"column:create_time" json:"createTime"`         // 创建时间
}

// 规则
type Rule struct {
	Id          int64    `gorm:"primaryKey;autoIncrement;column:id" json:"id"`           // 规则ID
	Name        string   `gorm:"column:name;size:64;null" json:"name"`                   // 名称
	Type        string   `gorm:"column:type;size:10;null" json:"type"`                   // scene,alarm
	TriggerType string   `gorm:"column:trigger_type;size:32;null" json:"triggerType"`    // 触发类型timer,device
	ProductId   string   `gorm:"column:product_id;size:64;null" json:"productId,omitempty"` // 产品
	State       string   `gorm:"column:state;size:10" json:"state"`                      // stop,start
	Cron        string   `gorm:"column:cron;size:32;null" json:"cron"`                   // cron
	Trigger     string   `gorm:"column:trigger;null" json:"trigger,omitempty"`           // 触发
	Actions     string   `gorm:"column:actions;null" json:"actions,omitempty"`           // 动作
	Desc        string   `gorm:"column:desc" json:"desc"`                                // 说明
	CreateId    int64    `gorm:"column:create_id;null" json:"createId"`                  // 创建者ID
	CreateTime  time.Time `gorm:"column:create_time" json:"createTime"`                   // 创建时间
}

type RuleRelDevice struct {
	Id       int64  `gorm:"primaryKey;autoIncrement;column:id" json:"id"`       // 关联ID
	RuleId   int64  `gorm:"column:rule_id;index" json:"ruleId"`                 // 规则ID
	DeviceId string `gorm:"column:device_id;size:64" json:"deviceId,omitempty"` // 设备Id
}

type Notify struct {
	Id         int64    `gorm:"primaryKey;autoIncrement;column:id" json:"id"`     // 通知ID
	Name       string   `gorm:"column:name;size:64;null" json:"name"`             // 名称
	Type       string   `gorm:"column:type;size:32;null" json:"type"`             // 类型
	State      string   `gorm:"column:state;size:10" json:"state"`                // 状态started,stopped
	Desc       string   `gorm:"column:desc;size:255" json:"desc"`                 // 说明
	Config     string   `gorm:"column:config" json:"config"`                      // 配置
	Template   string   `gorm:"column:template" json:"template"`                  // 内容模版
	CreateId   int64    `gorm:"column:create_id;null" json:"createId"`            // 创建者ID
	CreateTime time.Time `gorm:"column:create_time" json:"createTime"`             // 创建时间
}

// 告警记录
type AlarmLog struct {
	Id         int64     `gorm:"primaryKey;autoIncrement;column:id" json:"id"`           // 告警记录ID
	RuleId     int64     `gorm:"column:rule_id;index" json:"ruleId"`                     // 规则Id
	AlarmName  string    `gorm:"column:alarm_name;size:64;null" json:"alarmName"`        // 告警名称
	DeviceId   string    `gorm:"column:device_id;size:64;null;index" json:"deviceId"`    // 设备ID
	ProductId  string    `gorm:"column:product_id;size:64;null;index" json:"productId"`  // 产品ID
	State      string    `gorm:"column:state;size:10" json:"state"`                      // 状态open,solve
	AlarmData  string    `gorm:"column:alarm_data" json:"alarmData"`                     // 告警数据
	Desc       string    `gorm:"column:desc" json:"desc"`                                // 告警描述
	CreateId   int64     `gorm:"column:create_id;null" json:"createId"`                  // 创建者ID
	CreateTime time.Time `gorm:"column:create_time" json:"createTime"`                   // 创建时间
}
